package com.im.codec;

import com.alibaba.fastjson.JSONObject;
import com.im.codec.proto.MessagePack;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

/**
 * MessageEncoder 类继承自 Netty 的 MessageToByteEncoder 类，用于将消息编码成字节流。
 * 消息编码类，私有协议规则，前4位表示长度，接着command4位，后面是数据。
 */
public class MessageEncoder extends MessageToByteEncoder {

    /**
     * 重写 encode 方法，将 MessagePack 对象编码成字节流
     *
     * @param ctx ChannelHandlerContext 对象，提供 Channel 相关的操作
     * @param msg 待编码的消息对象
     * @param out 编码后的字节流
     */
    @Override
    protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception {
        // 判断 msg 是否是 MessagePack 类型
        if (msg instanceof MessagePack) {
            // 将 msg 强制转换为 MessagePack 类型
            MessagePack msgBody = (MessagePack) msg;
            // 将 MessagePack 中的数据转换为 JSON 字符串
            String s = JSONObject.toJSONString(msgBody.getData());
            // 将 JSON 字符串转换为字节数组
            byte[] bytes = s.getBytes();
            // 写入消息的指令类型
            out.writeInt(msgBody.getCommand());
            // 写入消息的长度
            out.writeInt(bytes.length);
            // 写入消息的内容
            out.writeBytes(bytes);
        }
    }
}
